#include <iostream>
#include <vector>
#include <queue>

using namespace std;
// 1245.树的直径
// https://leetcode.cn/problems/tree-diameter/description/
// 给出一棵无向树，测算并返回它的 直径：这棵树上行最长简单路径的边数
// 边 egdes 用来表示无向树，其中 edge[i] = [u, v]表示节点u和v之间的双向边

class Solution {
public:
    int treeDiameter(vector<vector<int>>& edges) {
        for(vector<int>& edge : edges) {
            int x = edge[0];
            int y = edge[1];
            n = max(n , max(x, y)); // 最大点的编号
        }
        n++;
        for(int i = 0; i < n; i++)
            to.push_back({});   // 出边数组
        for(vector<int>& edge : edges){
            int x = edge[0];
            int y = edge[1];
            to[x].push_back(y);
            to[y].push_back(x);
        }

        int p = findFarthest(0).first;  // 从0出发最远的点为p
        return findFarthest(p).second;
    }

private:
    int n;  // 点的数目
    vector<vector<int>> to; // 从一个点可以到哪些点
    // 从start开始，找到最远的点和距离 <点, 距离>
    pair<int, int> findFarthest(int start) {
        vector<int> depth(n, -1);   // 深度
        queue<int> q;
        q.push(start);
        depth[start] = 0;

        while(!q.empty()) {
            int x = q.front();
            q.pop();
            for(int y : to[x]) {
                if(depth[y] != -1) continue;    // 走过了
                depth[y] = depth[x] + 1;
                q.push(y);
            }
        }
        int ans = start;
        for(int i = 0; i < n; i++)
            if(depth[i] > depth[ans])
                ans = i;
        return {ans, depth[ans]};
    }
};
int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
